/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * DialogoAnulacionEjes.java
 *
 * Created on 12-may-2013, 22:46:22
 */
package com.camachosanchez.gui;

import com.camachosanchez.bean.Categorias;
import com.camachosanchez.bean.ControlCambioNeumatico;
import com.camachosanchez.bean.DetalleControlCambioBateria;
import com.camachosanchez.bean.DetalleControlCambioNeumatico;
import com.camachosanchez.bean.Ejes;
import com.camachosanchez.bean.FuncionEje;
import com.camachosanchez.bean.Neumaticos;
import com.camachosanchez.bean.Pilotos;
import com.camachosanchez.bean.Talleres;
import com.camachosanchez.bean.TiposEje;
import com.camachosanchez.bean.TiposVehiculo;
import com.camachosanchez.bean.Usuarios;
import com.camachosanchez.bean.Vehiculos;
import com.camachosanchez.controler.jdbc.ControlCambioNeumaticoJdbcControler;
import com.camachosanchez.controler.jdbc.PilotosJdbcControler;
import com.camachosanchez.controler.jdbc.TalleresJdbcControler;
import com.camachosanchez.controler.jdbc.TipoEjeJdbcControler;
import com.camachosanchez.controler.jpa.FuncionEjeJpaController;
import com.camachosanchez.gui.combo.MyComboBoxEditor;
import com.camachosanchez.gui.combo.MyComboBoxRenderer;
import com.camachosanchez.gui.table.ModeloTablaModificacionEjes;
import com.camachosanchez.gui.table.RenderizadorTablaAnulacionEjes;
import com.camachosanchez.gui.table.RenderizadorTablaModeloEjes;
import com.camachosanchez.mechanics.Eje;
import com.camachosanchez.mechanics.Llanta;
import com.camachosanchez.util.Constantes;
import com.camachosanchez.util.GUIUtil;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.SQLUtil;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.TooManyListenersException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

/**
 *
 * @author Rolando
 */
public class DialogoAnulacionEjes extends javax.swing.JDialog implements FocusListener {

    private Vehiculos vehiculo;
    private DefaultTableModel dm;
    private String[] funciones;
    private CardLayout layaout;
    private String cardLayoutAnterior;
    private JTextField textFieldCodigo;
    private TiposVehiculo tipoUnidad;
    private Image imagen;
    private int tipo_vehiculo;
    private int img_x;
    private int img_y;
    private Point centro;
    private int w_img = 0;
    private int h_img = 0;
    private Lienzo lienzo;
    private TiposEje tipoEje = null;
    private List<Eje> ejes;
    private ModeloTablaModificacionEjes modeloTablaNeumaticos;
//    private int id_llanta_agregada = -1;
//    private int posicion_llanta_agregada = -1;
    private List<Llanta> llantasMontadas;
    private List<Llanta> llantas_finales;
    private int draggedPoint;
    private boolean arrastra;
    private Llanta llanta_arrastrada;
    private Llanta llanta_temporal = null;
    private Eje eje_seleccionado;
    private Llanta llanta_seleccionada;
    private JPopupMenu popmenu;
    private int xAnteriorRaton = 0;
    private int yAnteriorRaton = 0;
    private EntityManagerFactory emf = null;
    private List<DetalleControlCambioBateria> detallesB =null;
    
    /** Creates new form DialogoAnulacionEjes */
    public DialogoAnulacionEjes(java.awt.Frame parent, boolean modal, Vehiculos vehiculo) {
        super(parent, modal);
        try {
            initComponents();
            this.emf = JPAUtil.getEntityManagerFactory();
            llantas_finales = new ArrayList<Llanta>();
            draggedPoint = -1;
            arrastra = false;
            llanta_arrastrada = null;
            eje_seleccionado = null;
            llanta_seleccionada = null;
            PilotosJdbcControler daoJdbcP = new PilotosJdbcControler();
            TalleresJdbcControler daoJdbcT = new TalleresJdbcControler();
            List<Pilotos> pilotos = daoJdbcP.findAll();
            List<Talleres> talleres = daoJdbcT.findAll();
            cmbPiloto.setModel(new DefaultComboBoxModel(pilotos.toArray()));
            cmbPatio.setModel(new DefaultComboBoxModel(talleres.toArray()));
            llantasMontadas = new ArrayList<Llanta>();
            modeloTablaNeumaticos = new ModeloTablaModificacionEjes();
            tblNeumaticos.setModel(modeloTablaNeumaticos);
            RenderizadorTablaAnulacionEjes render = new RenderizadorTablaAnulacionEjes();
            tblNeumaticos.setDefaultRenderer(String.class, render);
            DefaultTableCellRenderer r = (DefaultTableCellRenderer) tblNeumaticos.getTableHeader().getDefaultRenderer();
            r.setHorizontalAlignment(JLabel.CENTER);
            layaout = (CardLayout) getContentPane().getLayout();
            //        setSize(750, 400);
            this.vehiculo = vehiculo;
            setLocationRelativeTo(null);
            FuncionEjeJpaController funcion_dao = new FuncionEjeJpaController(null);
            List<FuncionEje> f = funcion_dao.findFuncionEjeEntities();
            funciones = new String[f.size()];
            int i = 0;
            for (FuncionEje funcionEje : f) {
                funciones[i++] = funcionEje.getNombre();
            }
            txtTipoUnidad.setText(vehiculo.getIdTipo().getNombre().toUpperCase());
            dm = new DefaultTableModel() {

                @Override
                public boolean isCellEditable(int row, int col) {
                    return col != 0;
                }

                @Override
                public Class getColumnClass(int c) {
                    return String.class;
                }
            };
            Object[] columns = new Object[]{"EJE", "NÚM. NEUMÁTICOS", "FUNCIÓN"};
            dm.setColumnIdentifiers(columns);
            tblEjes.setModel(dm);
            tblEjes.setFillsViewportHeight(true);
            TableColumn col = tblEjes.getColumnModel().getColumn(2);
            col.setCellEditor(new MyComboBoxEditor(funciones));
            col.setCellRenderer(new MyComboBoxRenderer(funciones));
            //Render
            //---------------------------------------------
            tblEjes.getTableHeader().setReorderingAllowed(false);
            DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) tblEjes.getTableHeader().getDefaultRenderer();
            renderer.setHorizontalAlignment(JLabel.CENTER);
            RenderizadorTablaModeloEjes render2 = new RenderizadorTablaModeloEjes();
            tblEjes.setDefaultRenderer(Object.class, render2);
            //---------------------------------------------
            GUIUtil.SetAnchoColumnas(tblEjes);
            List<Ejes> sistema_ejes = vehiculo.getIdTipoEje().getEjesList();
            Collections.sort(sistema_ejes);
            txtCantidadEjes.setText("" + sistema_ejes.size());
            for (Ejes es : sistema_ejes) {
                Object[] obj = new Object[3];
                obj[0] = es.getPosicion();
                obj[1] = es.getNumNeumaticos();
                obj[2] = es.getIdFuncion().getNombre();
                dm.addRow(obj);
                GUIUtil.SetAnchoColumnas(tblEjes);
            }
            inicializarImagenes(sistema_ejes.size());
            layaout.show(getContentPane(), "card4");
            btnGroup.add(rdbNuevo);
            btnGroup.add(rdbExistente);
            btnSiguiente1.setOpaque(true);
            btnGuardar1.setOpaque(true);
            btnCancelar1.setOpaque(true);
            List<TiposEje> ejesTemp = vehiculo.getIdTipo().getTiposEjeList();
            DefaultListModel modeloLista = new DefaultListModel();
            for (TiposEje item : ejesTemp) {
                if (item.getActivo()) {
                    modeloLista.addElement(item);
                }
            }
            lstTiposEjes.setModel(modeloLista);
            lienzo = new Lienzo();
            lienzo.revalidate();
            pnlMontajes.add(lienzo, BorderLayout.CENTER);
            establecerEventosTeclas();
            inicializarImagenes();
            tblNeumaticos.setDragEnabled(true);
            lienzo.setTransferHandler(new TransferHandler() {

                @Override
                public boolean canImport(TransferSupport support) {
                    if (!support.isDrop()) {
                        return false;
                    }
                    if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                        return false;
                    }
                    return true;
                }

                @Override
                public boolean importData(TransferSupport support) {
                    if (!canImport(support)) {
                        return false;
                    }
                    String llanta_agregada;
                    try {
                        llanta_agregada = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
                        String tokens[] = llanta_agregada.split("\t");
                        if (tokens.length == 4) {
                            int id_neumatico = Integer.parseInt(tokens[0]);
                            int posicion_neumatico = Integer.parseInt(tokens[1]);
                            llanta_temporal = new Llanta(id_neumatico);
                            llanta_temporal.setIdCategoria(posicion_neumatico);
                            llanta_temporal.setCodigo(tokens[2]);
                            llanta_temporal.setDescripcion(tokens[3]);
                        }
                    } catch (UnsupportedFlavorException e) {
                        JOptionPane.showMessageDialog(Principal.getInstance(), e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                        return false;
                    } catch (IOException e) {
                        JOptionPane.showMessageDialog(Principal.getInstance(), e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                        return false;
                    }
                    return true;
                }
            });

            lienzo.getDropTarget().addDropTargetListener(new DropTargetListener() {

                @Override
                public void dragOver(DropTargetDragEvent e) {
                }

                @Override
                public void dragEnter(DropTargetDragEvent e) {
                }

                @Override
                public void dragExit(DropTargetEvent e) {
                }

                @Override
                public void drop(DropTargetDropEvent e) {
                    if (llanta_temporal != null) {
                        for (Eje eje : ejes) {
                            if (eje.estaDentro(e.getLocation()) && !eje.isEstaMontado()) {
                                eje.setEstaMontado(true);
                                Llanta llanta = new Llanta(eje, llanta_temporal.getIdNeumatico(), lienzo.getWidth(), lienzo.getHeight());
                                llanta.setIdCategoria(llanta_temporal.getIdCategoria());
                                llanta.setCodigo(llanta_temporal.getCodigo());
                                llanta.setDescripcion(llanta_temporal.getDescripcion());
                                int pos = Integer.parseInt(tblNeumaticos.getValueAt(tblNeumaticos.getSelectedRow(), 1).toString());
                                String codigo = tblNeumaticos.getValueAt(tblNeumaticos.getSelectedRow(), 2).toString();
                                String desc = tblNeumaticos.getValueAt(tblNeumaticos.getSelectedRow(), 3).toString();
                                llanta.setPosicionInicial(pos);
                                llanta.setCodigo(codigo);
                                llanta.setDescripcion(desc);
                                llantas_finales.add(llanta);
                                modeloTablaNeumaticos.borrarLlanta(tblNeumaticos.getSelectedRow());
                                break;
                            }
                        }
                        llanta_temporal = null;
//                        pintarPosiciones();
                        lienzo.repaint();
                    }
                }

                @Override
                public void dropActionChanged(DropTargetDragEvent e) {
                }
            });

            lienzo.addMouseListener(lienzo);
            lienzo.addMouseMotionListener(lienzo);
            popmenu = new JPopupMenu();
            lienzo.add(popmenu);
            JMenuItem desmontar_menu = new JMenuItem("Desmontar");
            desmontar_menu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/arrow_right.png")));
            popmenu.add(desmontar_menu);
            desmontar_menu.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        if (llanta_seleccionada != null) {
                            llanta_seleccionada.getEje().setEstaMontado(false);
                            llantas_finales.remove(llanta_seleccionada);
//                            System.out.println(llanta_seleccionada.getIdNeumatico() + "\t" + llanta_seleccionada.getIdCategoria() + "\t" + llanta_seleccionada.getCodigo() + "\t" + llanta_seleccionada.getDescripcion());
//                            int pos = indiceDe(llanta_seleccionada, llantasMontadas);
//                            if (pos >= 0) {
//////                                llanta_seleccionada.setIdCategoria();//Stock
//                                llantasMontadas.set(pos, llanta_seleccionada);
//                            }
                            lienzo.repaint();
//                            NeumaticosJdbcControler dao = new NeumaticosJdbcControler();
//                            Neumaticos neumaticoTemporal = dao.findNeumatico(llanta_seleccionada.getIdNeumatico());
//                            neumaticoTemporal.setIdCategoria(new Categorias(Constantes.CATEGORIA_MONTADO));
                            modeloTablaNeumaticos.agregarNeumatico(llanta_seleccionada, 0);//agrega al inicio de la tabla
                            llanta_seleccionada = null;
//                            llenarTabla("");
                        }
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(Principal.getInstance(), ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                    }
                }
            });

        } catch (TooManyListenersException ex) {
            JOptionPane.showMessageDialog(Principal.getInstance(), ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    private int indiceDe(Llanta llanta, List<Llanta> llantas) {
        int pos = -1;
        int tam = llantas.size();
        for (int i = 0; i < tam; i++) {
            if (llantas.get(i).getIdNeumatico() == llanta.getIdNeumatico()) {
                pos = i;
                break;
            }
        }
        return pos;
    }

    private void inicializarImagenes() {
        if (vehiculo != null) {
            if (vehiculo.getIdTipo().getId() == Constantes.REMOLQUE) {
                imagen = (new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/cabezal-c.png"))).getImage();
                tipo_vehiculo = Constantes.REMOLQUE;
            } else if (vehiculo.getIdTipo().getId() == Constantes.SEMIREMOLQUE) {
                imagen = (new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/chasis-c.png"))).getImage();
                tipo_vehiculo = Constantes.SEMIREMOLQUE;
            } else if (vehiculo.getIdTipo().getId() == Constantes.FURGON) {
                imagen = (new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/bus-c.png"))).getImage();
                tipo_vehiculo = Constantes.FURGON;
            }
        }
    }

    public void generarEsquemaMontaje() {
        int max_num_llantas_x_eje = 0, num_ejes, pos = 0;
        int esquema[];
        ejes = new ArrayList<Eje>();
        w_img = imagen.getWidth(this);
        h_img = imagen.getHeight(this);
        centro = new Point(lienzo.getWidth(), lienzo.getHeight());
        img_x = (centro.x - w_img) / 2;//-/2
        img_y = (centro.y - h_img) / 2;
        if (tipoEje != null) {
            List<Ejes> sistema_ejes = tipoEje.getEjesList();
            Collections.sort(sistema_ejes);
            num_ejes = sistema_ejes.size();
            esquema = new int[sistema_ejes.size()];
            //ENCONTRAMOS EL MÁXIMO NÚMERO DE NEUMÁTICOS POR EJE
            int cantidadNeumaticos = 0;
            for (Ejes e : sistema_ejes) {
                int num_neumaticos = e.getNumNeumaticos();
                cantidadNeumaticos += num_neumaticos;
                if (num_neumaticos > max_num_llantas_x_eje) {
                    max_num_llantas_x_eje = num_neumaticos;
                }
                //ESTABLECEMOS EL NÚMERO DE VEHÍCULOS POR EJE
                esquema[pos++] = num_neumaticos;
            }
            max_num_llantas_x_eje /= 2;
            int posicion = cantidadNeumaticos;//para que empiece desde 1
            if (tipo_vehiculo == Constantes.SEMIREMOLQUE) {
                int ancho_total = 260;
                int alto_total = 70;
                int ancho_llanta;
                if (num_ejes == 1) {
                    ancho_llanta = 90;
                } else if (num_ejes < 4) {
                    ancho_llanta = 70;
                } else {
                    ancho_llanta = ancho_total / num_ejes;
                }
                if (max_num_llantas_x_eje == 1) {
                    alto_total = 45;
                }
                int alto_llanta = alto_total / max_num_llantas_x_eje;
                int xi = img_x + 240;
                int yi = img_y;

                for (int i = 0; i < sistema_ejes.size(); i++) {
                    //NÚMERO DE LLANTAS A CADA LADO DEL EJE
                    int limite = esquema[i] / 2;
//                //ARRIBA
                    int pos_x = xi + ancho_total - (i + 1) * ancho_llanta;
                    for (int j = 0; j < limite; j++) {
                        int pos_y = yi + alto_llanta * j;
                        Eje eje = new Eje(pos_x, pos_y, ancho_llanta, alto_llanta, posicion--, false, true);
                        ejes.add(eje);
                    }
                    //ABAJO
//                int k = -1;
                    for (int j = 0, k = 1; j < limite; j++, k++) {
                        int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1);
                        Eje eje = new Eje(pos_x, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k), false, true);
//                    k++;
                        ejes.add(eje);
                    }
//                k++;
                    posicion -= limite;
                }
                Eje ejeR1 = new Eje(60 - (ancho_llanta / 2), lienzo.getHeight() - 2 * (alto_llanta), ancho_llanta, alto_llanta, 0, false, true);
                Eje ejeR2 = new Eje(170 - (ancho_llanta / 2), lienzo.getHeight() - 2 * (alto_llanta), ancho_llanta, alto_llanta, -1, false, true);
                ejes.add(ejeR1);
                ejes.add(ejeR2);
            } else if (tipo_vehiculo == Constantes.REMOLQUE) {
                int ancho_total = 240;
                int alto_total = 64;
                int ancho_llanta;
                if (num_ejes < 4) {
                    ancho_llanta = 70;
                } else {
                    ancho_llanta = ancho_total / (num_ejes);
                }
                int xi = img_x + 260;
                int yi = img_y;
                int alto_llanta = 0;
                if (max_num_llantas_x_eje > 0) {
                    alto_llanta = alto_total / max_num_llantas_x_eje;
                }
                for (int i = 0; i < sistema_ejes.size() - 1; i++) {
                    int limite = esquema[i] / 2;
                    //Arriba
                    int pos_x = xi + ancho_total - (i + 1) * ancho_llanta;
                    for (int j = 0; j < limite; j++) {
                        int pos_y = yi + alto_llanta * j;
                        Eje eje = new Eje(pos_x, pos_y, ancho_llanta, alto_llanta, posicion--, false, true);
                        ejes.add(eje);
                    }
                    //Abajo
                    for (int j = 0, k = 1; j < limite; j++, k++) {
                        int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1);
                        Eje eje = new Eje(pos_x, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k), false, true);
                        ejes.add(eje);
                    }
                    posicion -= limite;
                }
                xi = img_x + 30;
                int limite = esquema[sistema_ejes.size() - 1] / 2;
                //Delanteras derecha
                for (int j = 0; j < limite; j++) {
                    int pos_y = yi + alto_llanta * j;
                    Eje eje = new Eje(xi, pos_y, ancho_llanta, alto_llanta, posicion--, false, true);
                    ejes.add(eje);
                }
                //Delanteras izquierda
                for (int j = 0, k = 1; j < limite; j++, k++) {
                    int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1);
                    Eje eje = new Eje(xi, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k), false, true);
                    ejes.add(eje);
                }
                posicion -= limite;
                Eje ejeR1 = new Eje(60 - (ancho_llanta / 2), lienzo.getHeight() - 60 - (alto_llanta / 2), ancho_llanta, alto_llanta, 0, false, true);
                Eje ejeR2 = new Eje(150 - (ancho_llanta / 2), lienzo.getHeight() - 60 - (alto_llanta / 2), ancho_llanta, alto_llanta, -1, false, true);
                ejes.add(ejeR1);
                ejes.add(ejeR2);
            } else if (tipo_vehiculo == Constantes.FURGON) {
                int alto_total = 80;
                if (max_num_llantas_x_eje < 2) {
                    alto_total = 40;
                }
                int ancho_llanta = 80;
                int alto_llanta = alto_total / max_num_llantas_x_eje;
                int valores[] = null;
                int yi = img_y;
                int anchoLienzo = lienzo.getWidth();
                switch (num_ejes) {
                    case 2:
                        valores = new int[]{anchoLienzo - 240, anchoLienzo - 520};
                        break;
                    case 3:
                        valores = new int[]{anchoLienzo - 200, anchoLienzo - 280, anchoLienzo - 540};
                        break;
                    case 4:
                        ancho_llanta = 80;
                        valores = new int[]{anchoLienzo - 180, anchoLienzo - 260, anchoLienzo - 470, anchoLienzo - 550};
                        break;
                }
                for (int i = 0; i < sistema_ejes.size(); i++) {
                    int limite = esquema[i] / 2;
                    //Arriba
                    int pos_x = valores[i];
                    for (int j = 0; j < limite; j++) {
                        int pos_y = yi + alto_llanta * j + 20;
                        Eje eje = new Eje(pos_x, pos_y, ancho_llanta, alto_llanta, posicion--, false, true);
                        ejes.add(eje);
                    }
                    //Abajo
                    for (int j = 0, k = 1; j < limite; j++, k++) {
                        int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1) - 20;
                        Eje eje = new Eje(pos_x, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k), false, true);
                        ejes.add(eje);
                    }
                    posicion -= limite;
                }
                Eje ejeR1 = new Eje(70 - (ancho_llanta / 2), lienzo.getHeight() - 60 - (alto_llanta / 2), ancho_llanta, alto_llanta, 0, false, true);
                Eje ejeR2 = new Eje(180 - (ancho_llanta / 2), lienzo.getHeight() - 60 - (alto_llanta / 2), ancho_llanta, alto_llanta, -1, false, true);
                ejes.add(ejeR1);
                ejes.add(ejeR2);
            }
        }
    }

    private void establecerEventosTeclas() {
        TableColumn columnaCodigo = tblEjes.getColumnModel().getColumn(1);
        textFieldCodigo = new JTextField();
        textFieldCodigo.addFocusListener(this);
//        textFieldCodigo.setBorder(BorderFactory.createEmptyBorder());
        textFieldCodigo.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 3));
        textFieldCodigo.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        DefaultCellEditor singleclickCodigo = new DefaultCellEditor(
                textFieldCodigo);
        singleclickCodigo.setClickCountToStart(1);
        columnaCodigo.setCellEditor(singleclickCodigo);
    }

    private void inicializarImagenes(int cantidadEjes) {
        if (vehiculo != null) {
            ImageIcon img = null;
            if (vehiculo.getIdTipo().getId() == Constantes.REMOLQUE) {
                URL url = getClass().getResource("/com/camachosanchez/recursos/cabezal-c-" + cantidadEjes + ".png");
                if (url != null) {
                    img = new javax.swing.ImageIcon(url);
                }
            } else if (vehiculo.getIdTipo().getId() == Constantes.SEMIREMOLQUE) {
                URL url = getClass().getResource("/com/camachosanchez/recursos/chasis-c-" + cantidadEjes + ".png");
                if (url != null) {
                    img = new javax.swing.ImageIcon(url);
                }
            } else if (vehiculo.getIdTipo().getId() == Constantes.FURGON) {
                URL url = getClass().getResource("/com/camachosanchez/recursos/bus-c-" + cantidadEjes + ".png");
                if (url != null) {
                    img = new javax.swing.ImageIcon(url);
                }
            }
            if (img != null) {
                lblImagen.setIcon(img);
            } else {
                lblImagen.setIcon(null);
            }
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnGroup = new javax.swing.ButtonGroup();
        pnlDatosModelo = new javax.swing.JPanel();
        pnlOpciones = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        btnSiguiente = new javax.swing.JButton();
        btnGuardar = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        lbltitulo = new javax.swing.JLabel();
        pnlContenedor = new javax.swing.JPanel();
        lblNombre = new javax.swing.JLabel();
        txtNombreModelo = new javax.swing.JTextField();
        lblTipoUnidad = new javax.swing.JLabel();
        txtTipoUnidad = new javax.swing.JTextField();
        tbpEjes = new javax.swing.JTabbedPane();
        scrEjes = new javax.swing.JScrollPane();
        tblEjes = new javax.swing.JTable();
        lblImagen = new javax.swing.JLabel();
        btnAgregarEje = new javax.swing.JButton();
        btnAnularEje = new javax.swing.JButton();
        lblCantidadEjes = new javax.swing.JLabel();
        txtCantidadEjes = new javax.swing.JTextField();
        lblMensaje = new javax.swing.JLabel();
        pnlMontajeTemporal = new javax.swing.JPanel();
        lblTitulo2 = new javax.swing.JLabel();
        pnlOpciones2 = new javax.swing.JPanel();
        btnAnterior = new javax.swing.JButton();
        btnGuardar2 = new javax.swing.JButton();
        btnCancelar2 = new javax.swing.JButton();
        pnlMontajeDesmontaje = new javax.swing.JPanel();
        pnlMontajes = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        tbpNeumaticos = new javax.swing.JTabbedPane();
        scrNeumaticos = new javax.swing.JScrollPane();
        tblNeumaticos = new javax.swing.JTable();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel4 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        txtKilometraje = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        txpComentarios = new javax.swing.JTextPane();
        jLabel6 = new javax.swing.JLabel();
        cmbPiloto = new javax.swing.JComboBox();
        cmbPatio = new javax.swing.JComboBox();
        pnlInicio = new javax.swing.JPanel();
        lblTitulo1 = new javax.swing.JLabel();
        pnlContenedor1 = new javax.swing.JPanel();
        btnSiguiente1 = new javax.swing.JButton();
        btnGuardar1 = new javax.swing.JButton();
        btnCancelar1 = new javax.swing.JButton();
        pnlContenedor2 = new javax.swing.JPanel();
        rdbNuevo = new javax.swing.JRadioButton();
        rdbExistente = new javax.swing.JRadioButton();
        scrTiposEjes = new javax.swing.JScrollPane();
        lstTiposEjes = new javax.swing.JList();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(".:: Asistente para la anulación o agregación de Ejes ::.");
        setResizable(false);
        getContentPane().setLayout(new java.awt.CardLayout());

        pnlDatosModelo.setBackground(new java.awt.Color(231, 239, 247));
        pnlDatosModelo.setLayout(new java.awt.BorderLayout());

        pnlOpciones.setOpaque(false);
        pnlOpciones.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 8, 8));

        jButton1.setBackground(new java.awt.Color(255, 255, 204));
        jButton1.setText("<<Anterior");
        jButton1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        jButton1.setContentAreaFilled(false);
        jButton1.setOpaque(true);
        jButton1.setPreferredSize(new java.awt.Dimension(70, 20));
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        pnlOpciones.add(jButton1);

        btnSiguiente.setBackground(new java.awt.Color(255, 255, 204));
        btnSiguiente.setText("Siguiente>>");
        btnSiguiente.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnSiguiente.setContentAreaFilled(false);
        btnSiguiente.setOpaque(true);
        btnSiguiente.setPreferredSize(new java.awt.Dimension(69, 20));
        btnSiguiente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSiguienteActionPerformed(evt);
            }
        });
        pnlOpciones.add(btnSiguiente);

        btnGuardar.setBackground(new java.awt.Color(255, 255, 204));
        btnGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/16_save.png"))); // NOI18N
        btnGuardar.setText("Guardar");
        btnGuardar.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnGuardar.setContentAreaFilled(false);
        btnGuardar.setEnabled(false);
        btnGuardar.setOpaque(true);
        btnGuardar.setPreferredSize(new java.awt.Dimension(70, 20));
        btnGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarActionPerformed(evt);
            }
        });
        pnlOpciones.add(btnGuardar);

        btnCancelar.setBackground(new java.awt.Color(255, 255, 204));
        btnCancelar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/16_cancel.png"))); // NOI18N
        btnCancelar.setText("Cancelar");
        btnCancelar.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnCancelar.setContentAreaFilled(false);
        btnCancelar.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        btnCancelar.setOpaque(true);
        btnCancelar.setPreferredSize(new java.awt.Dimension(70, 20));
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });
        pnlOpciones.add(btnCancelar);

        pnlDatosModelo.add(pnlOpciones, java.awt.BorderLayout.PAGE_END);

        lbltitulo.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        lbltitulo.setText("INFORMACIÓN DEL NUEVO MODELO DE LA UNIDAD");
        lbltitulo.setBorder(javax.swing.BorderFactory.createEmptyBorder(4, 10, 1, 1));
        pnlDatosModelo.add(lbltitulo, java.awt.BorderLayout.PAGE_START);

        pnlContenedor.setOpaque(false);

        lblNombre.setText("Nombre del modelo:");

        lblTipoUnidad.setText("Tipo de unidad:");

        txtTipoUnidad.setBackground(java.awt.SystemColor.inactiveCaptionBorder);
        txtTipoUnidad.setEditable(false);

        scrEjes.setBorder(null);
        scrEjes.setOpaque(false);

        tblEjes.setBackground(new java.awt.Color(240, 240, 240));
        tblEjes.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tblEjes.setRowHeight(22);
        scrEjes.setViewportView(tblEjes);

        tbpEjes.addTab("Ejes", scrEjes);

        lblImagen.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);

        btnAgregarEje.setBackground(new java.awt.Color(242, 225, 175));
        btnAgregarEje.setText("[+] Agregar eje");
        btnAgregarEje.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnAgregarEje.setContentAreaFilled(false);
        btnAgregarEje.setOpaque(true);
        btnAgregarEje.setPreferredSize(new java.awt.Dimension(79, 21));
        btnAgregarEje.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAgregarEjeActionPerformed(evt);
            }
        });

        btnAnularEje.setBackground(new java.awt.Color(242, 225, 175));
        btnAnularEje.setText("[-] Anular eje");
        btnAnularEje.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnAnularEje.setContentAreaFilled(false);
        btnAnularEje.setOpaque(true);
        btnAnularEje.setPreferredSize(new java.awt.Dimension(60, 21));
        btnAnularEje.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAnularEjeActionPerformed(evt);
            }
        });

        lblCantidadEjes.setText("Cantidad inicial de ejes:");

        txtCantidadEjes.setBackground(java.awt.SystemColor.inactiveCaptionBorder);
        txtCantidadEjes.setEditable(false);
        txtCantidadEjes.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        lblMensaje.setPreferredSize(new java.awt.Dimension(0, 18));

        javax.swing.GroupLayout pnlContenedorLayout = new javax.swing.GroupLayout(pnlContenedor);
        pnlContenedor.setLayout(pnlContenedorLayout);
        pnlContenedorLayout.setHorizontalGroup(
            pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlContenedorLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(pnlContenedorLayout.createSequentialGroup()
                        .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pnlContenedorLayout.createSequentialGroup()
                                .addComponent(lblNombre)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(txtNombreModelo))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pnlContenedorLayout.createSequentialGroup()
                                .addComponent(lblTipoUnidad)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(txtTipoUnidad, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(pnlContenedorLayout.createSequentialGroup()
                                .addComponent(lblCantidadEjes)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(txtCantidadEjes, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(lblMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, 339, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(pnlContenedorLayout.createSequentialGroup()
                        .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(pnlContenedorLayout.createSequentialGroup()
                                .addGap(204, 204, 204)
                                .addComponent(btnAgregarEje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(btnAnularEje, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(tbpEjes, javax.swing.GroupLayout.PREFERRED_SIZE, 390, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addComponent(lblImagen, javax.swing.GroupLayout.DEFAULT_SIZE, 453, Short.MAX_VALUE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pnlContenedorLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {lblNombre, lblTipoUnidad});

        pnlContenedorLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btnAgregarEje, btnAnularEje});

        pnlContenedorLayout.setVerticalGroup(
            pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlContenedorLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNombre)
                    .addComponent(txtNombreModelo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblMensaje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTipoUnidad)
                    .addComponent(txtTipoUnidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblCantidadEjes)
                    .addComponent(txtCantidadEjes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pnlContenedorLayout.createSequentialGroup()
                        .addComponent(tbpEjes, javax.swing.GroupLayout.DEFAULT_SIZE, 284, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(pnlContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnAnularEje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(btnAgregarEje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addComponent(lblImagen, javax.swing.GroupLayout.DEFAULT_SIZE, 311, Short.MAX_VALUE))
                .addContainerGap())
        );

        pnlDatosModelo.add(pnlContenedor, java.awt.BorderLayout.CENTER);

        getContentPane().add(pnlDatosModelo, "card2");

        pnlMontajeTemporal.setBackground(new java.awt.Color(231, 239, 247));
        pnlMontajeTemporal.setLayout(new java.awt.BorderLayout());

        lblTitulo2.setText("INFORMACIÓN DEL NUEVO MODELO DE LA UNIDAD");
        lblTitulo2.setBorder(javax.swing.BorderFactory.createEmptyBorder(4, 10, 1, 1));
        pnlMontajeTemporal.add(lblTitulo2, java.awt.BorderLayout.PAGE_START);

        pnlOpciones2.setOpaque(false);
        pnlOpciones2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 8, 8));

        btnAnterior.setBackground(new java.awt.Color(255, 255, 204));
        btnAnterior.setText("<<Anterior");
        btnAnterior.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnAnterior.setContentAreaFilled(false);
        btnAnterior.setOpaque(true);
        btnAnterior.setPreferredSize(new java.awt.Dimension(70, 20));
        btnAnterior.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAnteriorActionPerformed(evt);
            }
        });
        pnlOpciones2.add(btnAnterior);

        btnGuardar2.setBackground(new java.awt.Color(255, 255, 204));
        btnGuardar2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/16_save.png"))); // NOI18N
        btnGuardar2.setText("Guardar");
        btnGuardar2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnGuardar2.setContentAreaFilled(false);
        btnGuardar2.setOpaque(true);
        btnGuardar2.setPreferredSize(new java.awt.Dimension(70, 20));
        btnGuardar2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardar2ActionPerformed(evt);
            }
        });
        pnlOpciones2.add(btnGuardar2);

        btnCancelar2.setBackground(new java.awt.Color(255, 255, 204));
        btnCancelar2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/16_cancel.png"))); // NOI18N
        btnCancelar2.setText("Cancelar");
        btnCancelar2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnCancelar2.setContentAreaFilled(false);
        btnCancelar2.setOpaque(true);
        btnCancelar2.setPreferredSize(new java.awt.Dimension(70, 20));
        btnCancelar2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelar2ActionPerformed(evt);
            }
        });
        pnlOpciones2.add(btnCancelar2);

        pnlMontajeTemporal.add(pnlOpciones2, java.awt.BorderLayout.PAGE_END);

        pnlMontajeDesmontaje.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 8, 1, 8));
        pnlMontajeDesmontaje.setOpaque(false);
        pnlMontajeDesmontaje.setLayout(new java.awt.BorderLayout());

        pnlMontajes.setBackground(new java.awt.Color(255, 255, 255));
        pnlMontajes.setMinimumSize(new java.awt.Dimension(100, 100));
        pnlMontajes.setOpaque(false);
        pnlMontajes.setPreferredSize(new java.awt.Dimension(100, 100));
        pnlMontajes.setLayout(new java.awt.BorderLayout());
        pnlMontajeDesmontaje.add(pnlMontajes, java.awt.BorderLayout.CENTER);

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setOpaque(false);
        jPanel1.setPreferredSize(new java.awt.Dimension(200, 326));
        jPanel1.setLayout(new java.awt.BorderLayout());

        tbpNeumaticos.setPreferredSize(new java.awt.Dimension(205, 220));

        scrNeumaticos.setPreferredSize(new java.awt.Dimension(200, 402));

        tblNeumaticos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tblNeumaticos.setRowHeight(22);
        tblNeumaticos.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tblNeumaticos.setShowHorizontalLines(false);
        scrNeumaticos.setViewportView(tblNeumaticos);

        tbpNeumaticos.addTab("NEUMÁTICOS", scrNeumaticos);

        jPanel1.add(tbpNeumaticos, java.awt.BorderLayout.PAGE_START);

        jTabbedPane1.setBackground(new java.awt.Color(255, 255, 255));

        jLabel2.setText("Kilometraje: ");

        txtKilometraje.setText("0.0");

        jLabel3.setText("(km)");

        jLabel4.setText("Piloto:");

        jLabel5.setText("Patio");

        jScrollPane2.setViewportView(txpComentarios);

        jLabel6.setText("Comentarios:");

        cmbPiloto.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        cmbPatio.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel4Layout.createSequentialGroup()
                        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(jPanel4Layout.createSequentialGroup()
                                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cmbPatio, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel4Layout.createSequentialGroup()
                                    .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(cmbPiloto, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(jPanel4Layout.createSequentialGroup()
                                    .addComponent(jLabel2)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(txtKilometraje, javax.swing.GroupLayout.PREFERRED_SIZE, 113, javax.swing.GroupLayout.PREFERRED_SIZE))))
                        .addGap(43, 43, 43)
                        .addComponent(jLabel3)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel3)
                        .addComponent(txtKilometraje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
                        .addGap(5, 5, 5)
                        .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(cmbPiloto, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cmbPatio, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel6)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(61, 61, 61))
        );

        jTabbedPane1.addTab("Datos generales", jPanel4);

        jPanel1.add(jTabbedPane1, java.awt.BorderLayout.CENTER);

        pnlMontajeDesmontaje.add(jPanel1, java.awt.BorderLayout.LINE_END);

        pnlMontajeTemporal.add(pnlMontajeDesmontaje, java.awt.BorderLayout.CENTER);

        getContentPane().add(pnlMontajeTemporal, "card3");

        pnlInicio.setBackground(new java.awt.Color(231, 239, 247));
        pnlInicio.setLayout(new java.awt.BorderLayout());

        lblTitulo1.setText("INFORMACIÓN DEL NUEVO MODELO DE LA UNIDAD");
        lblTitulo1.setBorder(javax.swing.BorderFactory.createEmptyBorder(4, 10, 1, 1));
        pnlInicio.add(lblTitulo1, java.awt.BorderLayout.PAGE_START);

        pnlContenedor1.setOpaque(false);
        pnlContenedor1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 8, 8));

        btnSiguiente1.setBackground(new java.awt.Color(255, 255, 204));
        btnSiguiente1.setText("Siguiente>>");
        btnSiguiente1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnSiguiente1.setContentAreaFilled(false);
        btnSiguiente1.setOpaque(true);
        btnSiguiente1.setPreferredSize(new java.awt.Dimension(69, 20));
        btnSiguiente1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSiguiente1ActionPerformed(evt);
            }
        });
        pnlContenedor1.add(btnSiguiente1);

        btnGuardar1.setBackground(new java.awt.Color(255, 255, 204));
        btnGuardar1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/16_save.png"))); // NOI18N
        btnGuardar1.setText("Guardar");
        btnGuardar1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnGuardar1.setContentAreaFilled(false);
        btnGuardar1.setEnabled(false);
        btnGuardar1.setOpaque(true);
        btnGuardar1.setPreferredSize(new java.awt.Dimension(70, 20));
        pnlContenedor1.add(btnGuardar1);

        btnCancelar1.setBackground(new java.awt.Color(255, 255, 204));
        btnCancelar1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/16_cancel.png"))); // NOI18N
        btnCancelar1.setText("Cancelar");
        btnCancelar1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnCancelar1.setContentAreaFilled(false);
        btnCancelar1.setOpaque(true);
        btnCancelar1.setPreferredSize(new java.awt.Dimension(70, 20));
        btnCancelar1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelar1ActionPerformed(evt);
            }
        });
        pnlContenedor1.add(btnCancelar1);

        pnlInicio.add(pnlContenedor1, java.awt.BorderLayout.PAGE_END);

        pnlContenedor2.setOpaque(false);

        rdbNuevo.setSelected(true);
        rdbNuevo.setText("Utilizar el asistente para crear un nuevo modelo de ejes");
        rdbNuevo.setOpaque(false);

        rdbExistente.setText("Seleccionar un modelo de ejes existente");
        rdbExistente.setOpaque(false);
        rdbExistente.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                rdbExistenteStateChanged(evt);
            }
        });

        lstTiposEjes.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        lstTiposEjes.setEnabled(false);
        scrTiposEjes.setViewportView(lstTiposEjes);

        javax.swing.GroupLayout pnlContenedor2Layout = new javax.swing.GroupLayout(pnlContenedor2);
        pnlContenedor2.setLayout(pnlContenedor2Layout);
        pnlContenedor2Layout.setHorizontalGroup(
            pnlContenedor2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlContenedor2Layout.createSequentialGroup()
                .addGroup(pnlContenedor2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pnlContenedor2Layout.createSequentialGroup()
                        .addGap(27, 27, 27)
                        .addComponent(scrTiposEjes, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pnlContenedor2Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(rdbExistente, javax.swing.GroupLayout.DEFAULT_SIZE, 291, Short.MAX_VALUE))
                    .addGroup(pnlContenedor2Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(rdbNuevo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addGap(584, 584, 584))
        );
        pnlContenedor2Layout.setVerticalGroup(
            pnlContenedor2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlContenedor2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(rdbNuevo)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(rdbExistente, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(scrTiposEjes, javax.swing.GroupLayout.DEFAULT_SIZE, 324, Short.MAX_VALUE)
                .addContainerGap())
        );

        pnlInicio.add(pnlContenedor2, java.awt.BorderLayout.CENTER);

        getContentPane().add(pnlInicio, "card4");

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void btnAgregarEjeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAgregarEjeActionPerformed
// TODO add your handling code here:
    if (tblEjes.getCellEditor() != null) {
        tblEjes.getCellEditor().stopCellEditing();
    }
    Object[] obj = new Object[3];
    obj[0] = dm.getRowCount() + 1;
    obj[1] = "2";
    obj[2] = funciones[0];
    dm.addRow(obj);
    GUIUtil.SetAnchoColumnas(tblEjes);
    inicializarImagenes(dm.getRowCount());
}//GEN-LAST:event_btnAgregarEjeActionPerformed

private void btnAnularEjeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAnularEjeActionPerformed
// TODO add your handling code here:
    if (tblEjes.getCellEditor() != null) {
        tblEjes.getCellEditor().stopCellEditing();
    }
    int filaSeleccionada = tblEjes.getSelectedRow();
    if (filaSeleccionada >= 0) {
        dm.removeRow(filaSeleccionada);
        for (int i = 0; i < dm.getRowCount(); i++) {
            dm.setValueAt(i + 1, i, 0);
        }
        GUIUtil.SetAnchoColumnas(tblEjes);
        inicializarImagenes(dm.getRowCount());
    }
}//GEN-LAST:event_btnAnularEjeActionPerformed

private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
// TODO add your handling code here:
    dispose();
}//GEN-LAST:event_btnCancelarActionPerformed

private void btnSiguienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSiguienteActionPerformed
// TODO add your handling code here:
    if (tblEjes.getCellEditor() != null) {
        tblEjes.getCellEditor().stopCellEditing();
    }
    String nombreNuevoModelo = txtNombreModelo.getText();
    if (nombreNuevoModelo.isEmpty()) {
        lblMensaje.setText("<html><font color='red'>Ingrese el nombre del modelo</font></html>");
        txtNombreModelo.requestFocusInWindow();
    } else {
        TipoEjeJdbcControler doaJdbc = new TipoEjeJdbcControler();
        if (doaJdbc.existeTipoEje(nombreNuevoModelo) == 0) {
            llantasMontadas = new ArrayList<Llanta>();
            cardLayoutAnterior = "card2";
            layaout.show(getContentPane(), "card3");
            crearModeloEjeEnMemoria();
            generarEsquemaMontaje();
            llenarTablaNeumaticos();
        } else {
            lblMensaje.setText("<html><font color='red'>El nombre del modelo ya existe</font></html>");
            txtNombreModelo.requestFocusInWindow();
        }
    }
}//GEN-LAST:event_btnSiguienteActionPerformed

private void rdbExistenteStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_rdbExistenteStateChanged
// TODO add your handling code here:
    lstTiposEjes.setEnabled(rdbExistente.isSelected());
}//GEN-LAST:event_rdbExistenteStateChanged

private void btnSiguiente1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSiguiente1ActionPerformed
// TODO add your handling code here:
    cardLayoutAnterior = "card4";
    if (rdbNuevo.isSelected()) {
        layaout.show(getContentPane(), "card2");
        lblMensaje.setText("");
        txtNombreModelo.requestFocusInWindow();
    } else {
        TiposEje itemSeleccionado = (TiposEje) lstTiposEjes.getSelectedValue();
        if (itemSeleccionado != null) {
            layaout.show(getContentPane(), "card3");
            tipoEje = itemSeleccionado;
            generarEsquemaMontaje();
            llenarTablaNeumaticos();
        } else {
            rdbExistente.setText("<html><font color='red'>Seleccionar un modelo de ejes existente</font></html>");
        }
    }
}//GEN-LAST:event_btnSiguiente1ActionPerformed

private void btnAnteriorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAnteriorActionPerformed
// TODO add your handling code here:
    rdbExistente.setText("Seleccionar un modelo de ejes existente");
    lblMensaje.setText("");
    layaout.show(getContentPane(), cardLayoutAnterior);
}//GEN-LAST:event_btnAnteriorActionPerformed

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
    layaout.show(getContentPane(), "card4");
}//GEN-LAST:event_jButton1ActionPerformed

private void btnGuardar2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardar2ActionPerformed
// TODO add your handling code here:
    int filas = tblNeumaticos.getRowCount();
    if(filas > 0) {
        JOptionPane.showMessageDialog(this, "Los neumáticos sobrantes serán enviados a stock.", "Advertencia", JOptionPane.WARNING_MESSAGE);
    }
    guardar();
}//GEN-LAST:event_btnGuardar2ActionPerformed

    private void btnCancelar2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelar2ActionPerformed
        // TODO add your handling code here:
        dispose();
    }//GEN-LAST:event_btnCancelar2ActionPerformed

private void btnCancelar1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelar1ActionPerformed
// TODO add your handling code here:
    dispose();
}//GEN-LAST:event_btnCancelar1ActionPerformed

private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_btnGuardarActionPerformed
    
private void guardar() {
    EntityManager em = null;
    try {
        em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        Usuarios user = Constantes.currentUser;
        ControlCambioNeumatico control_cambio = new ControlCambioNeumatico();
        if (cmbPatio.getSelectedItem() != null) {
            control_cambio.setIdTaller((Talleres) cmbPatio.getSelectedItem());
        } else {
            JOptionPane.showMessageDialog(this, "Se debe asignar un taller en la realización de un montaje/desmontaje.\nSi no existe uno, agréguelo desde el menú de Logística.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
            cmbPatio.requestFocusInWindow();
            return;
        }
        if (cmbPiloto.getSelectedItem() != null) {
            control_cambio.setIdPiloto((Pilotos) cmbPiloto.getSelectedItem());
        } else {
            JOptionPane.showMessageDialog(this, "Se debe asignar un piloto en la realización de un montaje/desmontaje.\nSi no existe uno, agréguelo desde el menú de Logística.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
            cmbPiloto.requestFocusInWindow();
            return;
        }

        control_cambio.setFecha(new Date());
        control_cambio.setComentario(txpComentarios.getText());
        double kilometraje;
        try {
            kilometraje = Double.parseDouble(txtKilometraje.getText());
            control_cambio.setKilometraie(kilometraje);
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "El valor ingresado para el kilometraje debe ser un número.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
            txtKilometraje.requestFocusInWindow();
            return;
        }
        control_cambio.setIdUsuario(user);
        control_cambio.setFechaInsercionActualizacion(new Date());

        Boolean kmNuevo = false;
        List<DetalleControlCambioNeumatico> detalleControlCambio = new ArrayList<DetalleControlCambioNeumatico>();
        Vehiculos vehiculoTmp = (Vehiculos) em.getReference(Vehiculos.class, vehiculo.getId());

        //2. REGISTRAR LOS DESMONTAJES DE NEUMÁTICOS: TODOS LOS QUE QUEDARON ENLA TABLA 
        Categorias categoriaStock = new Categorias(Constantes.CATEGORIA_STOCK);
        int filas = modeloTablaNeumaticos.getRowCount();
        for(int i = 0; i < filas; i++) {
            DetalleControlCambioNeumatico dc = new DetalleControlCambioNeumatico();
            dc.setIdControlCambioNeumatico(control_cambio);
            dc.setTipo(-1);//Desmontaje
            dc.setFechaInsercionActualizacion(new Date());
            int idNeumatico = Integer.parseInt(modeloTablaNeumaticos.getValueAt(i, 0).toString());
            Neumaticos tire = (Neumaticos) em.getReference(Neumaticos.class, idNeumatico);
            tire.setIdCategoria(categoriaStock);
            tire.setIdUsuario(user);
            tire.setFechaInsercionActualizacion(new Date());
            tire.setInfMontaje("");//no hay información de montaje porque se encuantra desmontado
            int kmTotal = (tire.getKmTotal() == null) ? 0 : tire.getKmTotal();
            int kmMontaje = (tire.getKmAlMontaje() == null) ? 0 : tire.getKmAlMontaje();
            if (kmMontaje == 0) {//si es el primer montaje
                tire.setKmTotal(kmTotal);
            } else {
                if (kmMontaje >= kilometraje && kmNuevo == false) {
                    DialogoKilometrajeNuevo guiKmNuevo = new DialogoKilometrajeNuevo(Principal.getInstance(), true);
                    guiKmNuevo.setVisible(true);
                    if (guiKmNuevo.getGuardar()) {
                        kmNuevo = true;
                        tire.setKmTotal(kmTotal + (int) kilometraje);
                    } else {
                        kmNuevo = false;
                        txtKilometraje.setText(kmMontaje + "");
                        txtKilometraje.requestFocusInWindow();
                        txtKilometraje.selectAll();
                        return;
                    }
                    guiKmNuevo.dispose();
                } else if (kmMontaje >= kilometraje && kmNuevo) {
                    tire.setKmTotal(kmTotal + (int) kilometraje);
                } else {
                    tire.setKmTotal(kmTotal + ((int) kilometraje - kmMontaje));
                }

            }
            tire.setKmAlMontaje(0);//si se está desmontando, km al montaje se vuelve cero
            dc.setIdNeumatico(tire);
            int pos = Integer.parseInt(modeloTablaNeumaticos.getValueAt(i, 1).toString());
            dc.setPosicion(pos);
            detalleControlCambio.add(dc);
        }
        
        //----------------------------
        Categorias categoriaMontado = new Categorias(Constantes.CATEGORIA_MONTADO);
        //3. REGISTRAR LOS MONTAJES O LOS MOVIMIENTOS NEUTROS DE LOS NEUMÁTICOS
        for (Llanta llanta : llantas_finales) {
            DetalleControlCambioNeumatico dc = new DetalleControlCambioNeumatico();
            dc.setIdControlCambioNeumatico(control_cambio);
            dc.setId(0);
            dc.setTipo(1);//Montaje
            dc.setFechaInsercionActualizacion(new Date());
            Neumaticos tire = (Neumaticos) em.getReference(Neumaticos.class, llanta.getIdNeumatico());
            tire.setIdCategoria(categoriaMontado);
            tire.setIdUsuario(user);
            tire.setFechaInsercionActualizacion(new Date());
            String posicion = (llanta.getEje().getPosicion() <= 0) ? "R" : llanta.getEje().getPosicion() + "";
            tire.setInfMontaje((vehiculo.getCodBarras() != null ? vehiculo.getCodBarras() : "") + " : " + vehiculo.getPlaca() + " : " + posicion);
            //kilometraje del neumático
            //solo para los que cambian de posición, desmontado y vuelto a montar, o es neutro
            //los recién montados aún no hay un cálculo del km recorrido
            int kmTotal = (tire.getKmTotal() == null) ? 0 : tire.getKmTotal();
            int kmMontaje = (tire.getKmAlMontaje() == null) ? 0 : tire.getKmAlMontaje();
            if (kmMontaje == 0) {//si es el primer montaje
                tire.setKmTotal(kmTotal);
            } else {
                if (kmMontaje >= kilometraje && kmNuevo == false) {
                    DialogoKilometrajeNuevo guiKmNuevo = new DialogoKilometrajeNuevo(Principal.getInstance(), true);
                    guiKmNuevo.setVisible(true);
                    if (guiKmNuevo.getGuardar()) {
                        kmNuevo = true;
                        tire.setKmTotal(kmTotal + (int) kilometraje);
                    } else {
                        kmNuevo = false;
                        txtKilometraje.setText(kmMontaje + "");
                        txtKilometraje.requestFocusInWindow();
                        txtKilometraje.selectAll();
                        return;
                    }
                    guiKmNuevo.dispose();
                } else if (kmMontaje >= kilometraje && kmNuevo) {
                    tire.setKmTotal(kmTotal + (int) kilometraje);
                } else {
                    tire.setKmTotal(kmTotal + ((int) kilometraje - kmMontaje));
                }
            }
            
            tire.setKmAlMontaje((int) kilometraje);
            tire.setFechaMontaje(control_cambio.getFecha());

            dc.setIdNeumatico(tire);
            dc.setPosicion(llanta.getEje().getPosicion());
            detalleControlCambio.add(dc);
        }

         control_cambio.setIdUsuario(user);
        if (kmNuevo) {
            vehiculoTmp.setKmActual(vehiculo.getKmActual() + (int) kilometraje);
        } else {
            vehiculoTmp.setKmActual((int) kilometraje);
        }
        
        control_cambio.setDetalleControlCambioNeumaticoList(detalleControlCambio);
        if(detallesB != null){//agregamos la lista de baterías actuales
            for(DetalleControlCambioBateria item : detallesB) {
                item.setIdControlCambioNeumatico(control_cambio);
            }
            control_cambio.setDetalleControlCambioBateriaList(detallesB);
        }
        vehiculoTmp.setIdTipoEje(tipoEje);
        if (rdbNuevo.isSelected()) {//si se ha creado un nuevo tipo de eje
            //vehiculoTmp.setIdTipoEje(tipoEje);
            em.persist(tipoEje);
        }
        control_cambio.setIdVehiculo(vehiculoTmp);
        em.persist(control_cambio);
        tx.commit();
        JOptionPane.showMessageDialog(this, "El registro ha sido guardado correctamente.", "Operación finalizada", JOptionPane.INFORMATION_MESSAGE);
        dispose();
    } catch (Exception e) {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
        JOptionPane.showMessageDialog(Principal.getInstance(), e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
    } finally {
        if (em != null) {
            em.close();
        }
    }
}

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAgregarEje;
    private javax.swing.JButton btnAnterior;
    private javax.swing.JButton btnAnularEje;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnCancelar1;
    private javax.swing.JButton btnCancelar2;
    private javax.swing.ButtonGroup btnGroup;
    private javax.swing.JButton btnGuardar;
    private javax.swing.JButton btnGuardar1;
    private javax.swing.JButton btnGuardar2;
    private javax.swing.JButton btnSiguiente;
    private javax.swing.JButton btnSiguiente1;
    private javax.swing.JComboBox cmbPatio;
    private javax.swing.JComboBox cmbPiloto;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JLabel lblCantidadEjes;
    private javax.swing.JLabel lblImagen;
    private javax.swing.JLabel lblMensaje;
    private javax.swing.JLabel lblNombre;
    private javax.swing.JLabel lblTipoUnidad;
    private javax.swing.JLabel lblTitulo1;
    private javax.swing.JLabel lblTitulo2;
    private javax.swing.JLabel lbltitulo;
    private javax.swing.JList lstTiposEjes;
    private javax.swing.JPanel pnlContenedor;
    private javax.swing.JPanel pnlContenedor1;
    private javax.swing.JPanel pnlContenedor2;
    private javax.swing.JPanel pnlDatosModelo;
    private javax.swing.JPanel pnlInicio;
    private javax.swing.JPanel pnlMontajeDesmontaje;
    private javax.swing.JPanel pnlMontajeTemporal;
    private javax.swing.JPanel pnlMontajes;
    private javax.swing.JPanel pnlOpciones;
    private javax.swing.JPanel pnlOpciones2;
    private javax.swing.JRadioButton rdbExistente;
    private javax.swing.JRadioButton rdbNuevo;
    private javax.swing.JScrollPane scrEjes;
    private javax.swing.JScrollPane scrNeumaticos;
    private javax.swing.JScrollPane scrTiposEjes;
    private javax.swing.JTable tblEjes;
    private javax.swing.JTable tblNeumaticos;
    private javax.swing.JTabbedPane tbpEjes;
    private javax.swing.JTabbedPane tbpNeumaticos;
    private javax.swing.JTextPane txpComentarios;
    private javax.swing.JTextField txtCantidadEjes;
    private javax.swing.JTextField txtKilometraje;
    private javax.swing.JTextField txtNombreModelo;
    private javax.swing.JTextField txtTipoUnidad;
    // End of variables declaration//GEN-END:variables

    @Override
    public void focusGained(FocusEvent e) {
        if (e.getSource() == textFieldCodigo) {
            textFieldCodigo.setBackground(new Color(255, 204, 51));
            textFieldCodigo.requestFocusInWindow();
            textFieldCodigo.setEditable(true);
            textFieldCodigo.selectAll();
        }
    }

    @Override
    public void focusLost(FocusEvent e) {
    }

    private void crearModeloEjeEnMemoria() {
        tipoEje = new TiposEje();
        tipoEje.setIdTipoVehiculo(vehiculo.getIdTipo());
        //tipoEje.setId(-1);
        tipoEje.setNombre(txtNombreModelo.getText());
        List<Ejes> ejesTemporales = new ArrayList<Ejes>();
        int posicion;
        int numero_neumaticos;
        FuncionEje funcion;
        for (int i = 0; i < dm.getRowCount(); i++) {
            Ejes eje = new Ejes();
            try {
                posicion = Integer.parseInt(dm.getValueAt(i, 0).toString());
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(this, "Los ejes deben ser valores numéricos.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                return;
            }
            try {
                numero_neumaticos = Integer.parseInt(dm.getValueAt(i, 1).toString());
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(this, "El número de neumáticos por eje debe ser un valor numérico.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                return;
            }
            if (numero_neumaticos < 2 || numero_neumaticos % 2 != 0) {
                JOptionPane.showMessageDialog(this, "El número de neumáticos por eje debe ser un número par.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                return;
            }
            String funcion_nombre = dm.getValueAt(i, 2).toString();
            funcion = SQLUtil.buscarPorNombreFuncionEje(funcion_nombre);
            if (funcion == null) {
                JOptionPane.showMessageDialog(this, "La función asignada al eje es incorrecta.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
                return;
            }
            eje.setPosicion(posicion);
            eje.setNumNeumaticos(numero_neumaticos);
            eje.setIdFuncion(funcion);
            ejesTemporales.add(eje);
        }
        if (ejesTemporales.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Inserte ejes al modelo.", "Datos incorrectos", JOptionPane.WARNING_MESSAGE);
            return;
        }
        for (Ejes e : ejesTemporales) {
            e.setIdEje(tipoEje);
        }
        tipoEje.setActivo(true);
        tipoEje.setEstado(true);
        tipoEje.setEjesList(ejesTemporales);
    }

    private void llenarTablaNeumaticos() {
        modeloTablaNeumaticos.limpiar();
        ControlCambioNeumaticoJdbcControler daoJdbc = new ControlCambioNeumaticoJdbcControler();
        ControlCambioNeumatico control = daoJdbc.findUltimoControlCambio(vehiculo.getId());
        if(control != null) {
            List<DetalleControlCambioNeumatico> detalles = control.getDetalleControlCambioNeumaticoList();
            Collections.sort(detalles);
            for (DetalleControlCambioNeumatico d : detalles) {
                if (d.getTipo() == 0 || d.getTipo() == 1) {
                    Llanta l = new Llanta(null, 0, 0, 0);
                    l.setIdNeumatico(d.getIdNeumatico().getId());
                    l.setPosicionInicial(d.getPosicion());
                    l.setCodigo(d.getIdNeumatico().getCodigo());
                    l.setDescripcion(d.getIdNeumatico().getIdModelo().getMedida());
                    l.setIdCategoria(d.getIdNeumatico().getIdCategoria().getId());
                    modeloTablaNeumaticos.agregarNeumatico(l, -1);
                    llantasMontadas.add(l);
                }
            }
            detallesB = control.getDetalleControlCambioBateriaList();
            Collections.sort(detallesB);
        }
        GUIUtil.SetAnchoColumnas(tblNeumaticos);
        setColumnaOculta();
    }

    private void setColumnaOculta() {
        tblNeumaticos.getColumnModel().getColumn(0).setMinWidth(0);
        tblNeumaticos.getColumnModel().getColumn(0).setMaxWidth(0);
        tblNeumaticos.getColumnModel().getColumn(0).setPreferredWidth(0);
    }

    class Lienzo extends JPanel implements MouseListener, MouseMotionListener {

        @Override
        protected void paintComponent(Graphics g) {
            int width = this.getWidth();
            int height = this.getHeight();
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//            g2.setColor(new Color(224, 224, 208));
            g2.setColor(Color.white);
            g2.fillRect(0, 0, width, height);
            g2.setColor(new Color(240, 240, 240));
            for (int i = 0; i < width; i++) {
                int k = i * 10;
                g2.drawLine(k, 0, k, height);
            }
            for (int i = 0; i < height; i++) {
                int k = i * 10;
                g2.drawLine(0, k, width, k);
            }
            g2.setColor(Color.black);
            float dash[] = {4.0f};
            g2.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f));
            g2.drawRect(10, 10, width - 20, height - 20);
//            g2.setStroke(new BasicStroke());
//            GraphicsUtil.graficarCruz(g2, 5, 5, 10);
//            GraphicsUtil.graficarCruz(g2, width - 15, height - 15, 10);
//            GraphicsUtil.graficarCruz(g2, 5, height - 15, 10);
//            GraphicsUtil.graficarCruz(g2, width - 15, 5, 10);
//            g2.setColor(new Color(51, 51, 51));
//            g2.setFont(new Font("Arial", Font.PLAIN, 12));
            g2.drawImage(imagen, img_x, img_y, w_img, h_img, this);
//            g2.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f));
//            g2.drawLine(img_x + (w_img / 2), img_y, img_x + (w_img / 2), img_y + h_img);
//            g2.drawLine(img_x, img_y + (h_img / 2), img_x + w_img, img_y + (h_img / 2));
//            g2.setStroke(new BasicStroke());
//            g2.setColor(Color.white);
//            g2.fillRect(20, height - 120, 230, 100);
            if (ejes != null) {
                for (Eje eje : ejes) {
                    eje.graficar(g2);
                }
            }
            if (llantas_finales != null) {
                for (Llanta llanta : llantas_finales) {
                    llanta.graficar(g2);
                }
            }
            g2.setFont(new Font("Arial", Font.BOLD, 14));
            FontMetrics fontMetrics = g2.getFontMetrics();
            if (tipoEje != null) {
                String descripcionUnidad = ("Unidad: [" + vehiculo.getIdTipo().getNombre() + " / " + vehiculo.getPlaca() + "] - Modelo de ejes: [" + tipoEje.getNombre()).toUpperCase() + "]";
                int anchoDescripcion = fontMetrics.stringWidth(descripcionUnidad);
                g2.drawString(descripcionUnidad, width - anchoDescripcion - 20, 35);
            }
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
            this.requestFocus();
            for (Llanta llanta : llantas_finales) {
                if (llanta.estaDentro(e.getPoint())) {
                    draggedPoint = llanta.getIdNeumatico();
                    break;
                }
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            boolean found = false;
            if (!SwingUtilities.isRightMouseButton(e)) {
                if (arrastra) {
                    for (Eje eje : ejes) {
                        if (eje.estaDentro(e.getPoint()) && !eje.isEstaMontado()) {
                            eje.setEstaMontado(true);
                            llanta_arrastrada.setX(eje.getX());
                            llanta_arrastrada.setY(eje.getY());
                            llanta_arrastrada.setEje(eje);
                            eje_seleccionado.setEstaMontado(false);
                            found = true;
                            break;
                        }
                    }
                    if (!found && llanta_arrastrada != null) {
                        llanta_arrastrada.setX(eje_seleccionado.getX());
                        llanta_arrastrada.setY(eje_seleccionado.getY());
                    }
                    //pintarPosiciones();
                }
            } else if (e.isPopupTrigger()) {
                //hideToolTip();
                llanta_seleccionada = null;
                for (Llanta llanta : llantas_finales) {
                    if (llanta.estaDentro(e.getPoint())) {
                        llanta_seleccionada = llanta;
                        break;
                    }
                }
                if (llanta_seleccionada != null) {
                    popmenu.show(e.getComponent(), e.getX(), e.getY());
                }

            }
            draggedPoint = -1;
            llanta_arrastrada = null;
            eje_seleccionado = null;
            arrastra = false;
            this.repaint();
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (e.getX() >= 0 && e.getY() >= 0) {
                if (!SwingUtilities.isRightMouseButton(e)) {
                    if (draggedPoint == -1) {
                        return;
                    }
                    if (draggedPoint > -1) {
                        if (llanta_arrastrada == null) {
                            xAnteriorRaton = (int) (e.getX());
                            yAnteriorRaton = (int) (e.getY());
                            for (Llanta llanta : llantas_finales) {
                                if (llanta.estaDentro(e.getPoint())) {
                                    llanta_arrastrada = llanta;
                                    eje_seleccionado = llanta.getEje();
                                    break;
                                }
                            }
                            if (llanta_arrastrada != null) {
                                int indice = llantas_finales.indexOf(llanta_arrastrada);
                                try {
                                    Collections.swap(llantas_finales, indice, llantas_finales.size() - 1);
                                } catch (ArrayIndexOutOfBoundsException ex) {
                                    draggedPoint = -1;
                                    llanta_arrastrada = null;
                                    eje_seleccionado = null;
                                    JOptionPane.showMessageDialog(Principal.getInstance(), ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                                }
                            }

                        } else {
                            int xx, yy;
                            xx = llanta_arrastrada.getX() + (e.getX() - xAnteriorRaton);
                            yy = llanta_arrastrada.getY() + (e.getY() - yAnteriorRaton);
                            llanta_arrastrada.setX(xx);
                            llanta_arrastrada.setY(yy);
                            xAnteriorRaton = (int) e.getX();
                            yAnteriorRaton = (int) e.getY();
                            arrastra = true;
                            repaint();
                        }
                    }
                }
            }
        }

        @Override
        public void mouseMoved(MouseEvent e) {
        }
    }
}
